from implement.layers.basic.model import Model
from implement.layers.basic.affine import Affine
from utils.functions_collect import sigmoid


# MLP是Multi-Layer Perceptron 意思是多层感知器
class MLP(Model):
    # fc是full contact（全连接）的缩写
    # fc_output_sizes可以是元祖或列表，用于指定全连接层的输出大小，
    # 例如(10,1)表示创建2个Linear层，第一层的输出大小是10，第二层的输出大小是1
    # activation用来指定激活函数

    def __init__(self, fc_output_sizes, activation=sigmoid):
        """
        初始化多层感知机模型。

        Parameters:
            fc_output_sizes: 包含每个全连接层输出尺寸的列表。
            activation (function, optional): 激活函数，默认为 sigmoid。

        Notes:
            这个模型由多个全连接层组成，层数和每层的输出尺寸由 `fc_output_sizes` 参数指定。
        """
        super().__init__()
        self.activation = activation
        self.layers = []

        for i, out_size in enumerate(fc_output_sizes):
            # 创建线性层
            layer = Affine(out_size)

            # 使用 setattr 设置实例变量，变量名为 'l' + str(i)
            setattr(self, 'l' + str(i), layer)

            # 将当前层添加到 layers 列表中
            self.layers.append(layer)

    def forward(self, x):
        """
        前向传播函数，通过多层全连接层进行数据流传递。

        Parameters:
            x: 输入数据。

        Returns:
            y: 模型的输出。
        """
        for l in self.layers[:-1]:
            x = self.activation(l(x))  # 激活函数作用于除最后一层外的所有层
        return self.layers[-1](x)  # 最后一层全连接层的输出
